package tool

// by daoyi
import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"log"
	"os"
	"time"
)

var Gdb *gorm.DB
var err error

func InitDatabase() {

	//自定义日志模板 打印SQL语句
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags),
		logger.Config{
			SlowThreshold: time.Second, //慢SQL阈值
			LogLevel:      logger.Info, //级别
			Colorful:      true,        //彩色
		},
	)

	//获取config配置信息
	Cfg, err := ParseConfig("./config/app.json")
	//判断读取是否成功，失败则抛出异常
	if err != nil {
		panic(err.Error())
	}
	dsn := Cfg.Mysql.Root + ":" + Cfg.Mysql.Pwd + "@tcp(" + Cfg.Mysql.Local + ":" + Cfg.Mysql.Port + ")/" + Cfg.Mysql.Database + "?charset=utf8mb4&parseTime=True&loc=Local"
	Db, err := gorm.Open(mysql.New(mysql.Config{
		DSN: dsn,
		//DSN:                       "root:root123@tcp(localhost:3306)/ginchat?charset=utf8mb4&parseTime=True&loc=Local",
		DefaultStringSize:         256,
		SkipInitializeWithVersion: false,
	}), &gorm.Config{
		SkipDefaultTransaction: false,
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   "za_", //表前缀，‘User’的表名应该是‘za_users’
			SingularTable: true,  // 使用单数表名，启用该选项，此时 ‘User’的表名应该是‘za_user’
		},
		DisableForeignKeyConstraintWhenMigrating: true,      // 逻辑外键 （代码里面自动外键 ，外键关系）
		Logger:                                   newLogger, //数据初始化，加入log日志
	})

	//链接池设置
	sqlDB, _ := Db.DB()
	sqlDB.SetMaxIdleConns(10)           //链接池中，最大的空闲链接数
	sqlDB.SetConnMaxIdleTime(100)       //链接池中，最多容纳的链接数量
	sqlDB.SetConnMaxLifetime(time.Hour) //链接池中，链接的最大可复用时间

	//M := DB.Migrator() //自动建表函数
	//fmt.Println(M.HasTable(&User{}))
	//// database name and    password
	if err != nil {
		log.Println(err)
	}

	//Runtime.db = Db
	//
	//// 初始化 casbin
	//casbin, err := Setup(Db)
	//if err != nil {
	//	panic(fmt.Sprintf("初始化casbin失败，出现错误: %v", err))
	//}
	//Runtime.casbin = casbin

	Gdb = Db
}
